package delphorm.web.controller;


import java.util.Iterator;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import delphorm.entite.personne.Utilisateur;
import delphorm.entite.questionnaire.InstanceQuestion;
import delphorm.entite.questionnaire.InstanceQuestionnaire;
import delphorm.entite.questionnaire.InstanceReponse;
import delphorm.entite.questionnaire.InstanceReponseFermee;
import delphorm.entite.questionnaire.InstanceReponseOuverte;
import delphorm.entite.questionnaire.Question;
import delphorm.entite.questionnaire.Questionnaire;
import delphorm.entite.questionnaire.Reponse;
import delphorm.entite.questionnaire.Valeur;
import delphorm.entite.questionnaire.ValeurNumerique;
import delphorm.entite.questionnaire.ValeurTexte;
import delphorm.service.questionnaire.IQuestionnaire;
import delphorm.web.exception.MauvaiseManipulationException;
import delphorm.web.taglibs.Toolz;



public class EnregistrerInstanceQuestionnaire implements Controller {
	IQuestionnaire serviceQuestionnaire;
	
	public IQuestionnaire getServiceQuestionnaire() {
		return serviceQuestionnaire;
	}

	public void setServiceQuestionnaire(IQuestionnaire serviceQuestionnaire) {
		this.serviceQuestionnaire = serviceQuestionnaire;
	}

	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		//récupère le questionnaire

//		recupere le numero du questionnaire
		String numStr = request.getParameter("numeroquestionnaire");
		//TODO exception si null
		Long numero = Long.parseLong(numStr);
		//TODO exception si erreur
		//va chercher le questionnaire dans la bd
		Questionnaire questionnaire = serviceQuestionnaire.getQuestionnaireParId(numero);
		//TODO exception si questionnaire == null
		//TODO verifier que le questionnaire est en publication
		
		//récupére l'utilisateur
		Utilisateur auteur = (Utilisateur) request.getSession().getAttribute("utilisateur");
		//TODO exception si null
		
		//crée une instance de questionnaire
		InstanceQuestionnaire instanceQuestionnaire = new InstanceQuestionnaire();
		instanceQuestionnaire.setAuteur(auteur);
		instanceQuestionnaire.setQuestionnaire(questionnaire);
		
		//récupère les paramètres et initialise l'instance du questionnaire
		
		Iterator itQuestions = questionnaire.getQuestions().iterator();
		//pour chaque question
		while(itQuestions.hasNext())
		{
			Question question = (Question)itQuestions.next();
			//cré l'instance question et l'ajoute a l'instance questionnaire
			InstanceQuestion instanceQuestion = new InstanceQuestion();
			instanceQuestionnaire.getInstancesQuestion().add(instanceQuestion);
		
			//cette variable contient l'instance de reponse courant
			InstanceReponse instanceReponse = null;
			
			// UNE ET UNE SEULE REPONSE
			///////////////////////////
			
			//dans ce cas, il n'y a qu´UNE et UNE SEULE réponse, c'est un bouton radio
			//if(question.getMinReponses().intValue() == 1 && question.getMaxReponses().intValue() == 1)
			if(Toolz.getTypeControl(question,null).equals("radio"))
			{
				//récupere la valeur du choix utilisateur il correspond au code de la réponse
				String valeurChoix = request.getParameter("reponse_question_"+question.getPlace());
				//TODO localisation dans le fichier de message
				if(valeurChoix == null)
					throw new MauvaiseManipulationException(this.getClass(),"Le choix ne peut pas être nul.");
				int code = Integer.parseInt(valeurChoix);
				//récupere la reponse de la question qui correspond au code
				Reponse reponse = question.getReponse(new Integer(code));
				//récupère l'instance de réponse
				instanceReponse = traiterReponse(request, question, reponse);
				ajouterInstanceReponse(instanceReponse,instanceQuestion);
			}
			
			//dans ce cas, c'est UNE et UNE SEULE réponse ouverte, il y a qu'un seul choix possib pour l'utilisateur, il n'y a pas de contrôle
			else if(Toolz.getTypeControl(question,null).equals("aucun"))
			{
				Reponse reponse = (Reponse)question.getReponses().get(0);
				instanceReponse = traiterReponseOuverte(request, question, reponse);
				ajouterInstanceReponse(instanceReponse,instanceQuestion);
			}
			
			// PLUSIEURS REPONSES
			/////////////////////
			
			else
			{
				Iterator itReponses = question.getReponses().iterator();
				//pour chaque réponse
				while(itReponses.hasNext())
				{
					
					Reponse reponse = (Reponse)itReponses.next();
					//cas de reponse numerotee
					if(Toolz.getTypeControl(question).equals("liste")/*question.getOrdonnee().booleanValue()==true*/)
					{
						instanceReponse = traiterReponseNumerotee( request,  question,  reponse);
					}
					else if(Toolz.getTypeControl(question).equals("checkbox"))
					{
						instanceReponse = traiterReponseCochee( request,  question,  reponse);
					}
					//TODO else exception
					ajouterInstanceReponse(instanceReponse,instanceQuestion);
				}	
			}
		}
		Iterator it;
		it = instanceQuestionnaire.getInstancesQuestion().iterator();
		while(it.hasNext())
		{
			InstanceQuestion iq = (InstanceQuestion)it.next();
			System.out.println("question");
			Iterator it2 = iq.getInstancesReponse().iterator();
			while(it2.hasNext())
			{
				InstanceReponse ir = (InstanceReponse)it2.next();
				System.out.println(ir.getClass().getName());
			}
		}
		return null;
	}

	private void ajouterInstanceReponse(InstanceReponse instanceReponse, InstanceQuestion instanceQuestion) {
		// TODO Auto-generated method stub
		if(instanceReponse != null)
			instanceQuestion.getInstancesReponse().add(instanceReponse);
	}

	private InstanceReponse traiterReponseCochee(HttpServletRequest request, Question question, Reponse reponse) {
		//recupere la valeur du bouton checkbox
		String valeurCheckbox = request.getParameter("reponse_question_"+question.getPlace()+"_"+reponse.getCode());
		String code = new String(""+reponse.getCode());
		
		//si la case n'est pas cochée, on passe 
		if(!valeurCheckbox.equals(code))
		{
			return null;
		}
		else
		{
			return traiterReponse(request, question, reponse);
		}
	}



	
	
	private InstanceReponse traiterReponseNumerotee(HttpServletRequest request, Question question, Reponse reponse)
	{
		//recupere la valeur de la liste déroulante
		String valeurListe= request.getParameter("reponse_question_"+question.getPlace()+"_"+reponse.getCode());
		//TODO exception si null 
		
		
		Integer numeroOrdre=null;
		//si la réponse est  numérotée
		if(!valeurListe.equals("-1"))
		{
			int numero = Integer.parseInt(valeurListe);
			numeroOrdre = new Integer(numero);
		}
		
		InstanceReponse instanceReponse = traiterReponse(request, question, reponse);
		instanceReponse.setNumeroOrdre(numeroOrdre);
		return instanceReponse;
	}
	
	private InstanceReponse traiterReponse(HttpServletRequest request, Question question, Reponse reponse)
	{
		if(reponse.getType().equals("ouverte"))
		{
			return traiterReponseOuverte(request, question, reponse);
		}
		
		else if(reponse.getType().equals("fermee"))
		{
			return traiterReponseFermee(request, question, reponse);
		}
		
		//TODO else exception
		
		return null;
	}
	
	private InstanceReponseOuverte traiterReponseOuverte(HttpServletRequest request, Question question, Reponse reponse)
	{
//		récupere la valeur saisie par l'utilisateur
		String valeurReponse = request.getParameter("reponseouverte_question_"+question.getPlace()+"_"+reponse.getCode());
		//TODO exception si null
	
//		crée l'instance de la réponse
		InstanceReponseOuverte instanceReponseOuverte = new InstanceReponseOuverte();
		instanceReponseOuverte.setReponse(reponse);
		//fixe la valeur de l instance de reponse ouverte
		Valeur valeur = getValeurFromParameter(valeurReponse, reponse);
		instanceReponseOuverte.setValeur(valeur);
		
		//retourne reponse
		return instanceReponseOuverte;
	}
	
	private InstanceReponseFermee traiterReponseFermee(HttpServletRequest request, Question question, Reponse reponse)
	{
		InstanceReponseFermee instanceReponseFermee = new InstanceReponseFermee();
		instanceReponseFermee.setReponse(reponse);
		return instanceReponseFermee;
	}
	
	private Valeur getValeurFromParameter(String valeurParam, Reponse reponse)
	{
//		fixe la valeur texte
		if(reponse.getTypeDeDonnees().equals(new Character('T')))
		{
			ValeurTexte valeur = new ValeurTexte();
			valeur.setValeur(valeurParam);
			return valeur;
		}
		
//		fixe la valeur numérique
		else if(reponse.getTypeDeDonnees().equals(new Character('N')))
		{
			ValeurNumerique valeur = new ValeurNumerique();
			try
			{
				double valeurD = Double.parseDouble(valeurParam);
				valeur.setValeur(new Double(valeurD));
			}
			catch(NumberFormatException e)
			{
				valeur.setValeur(null);
			}
			return valeur;
		}
		
//		TODO else exception
		return null;
	}
}
